iT邦幫忙

2025 iThome 鐵人賽

DAY 23
2

前言

昨天我們完成了遊戲的基本介紹與專案規劃,今天要正式進入 Sudoku 的資料結構設計。
一個數獨遊戲的核心就是 9x9 的盤面,如何設計盤面、如何表示格子的狀態,將會影響到後續的遊戲邏輯。

今日目標

  • 設計一個 9x9 的二維整數陣列,表示數獨盤面。
  • 定義格子狀態:
    • 預設數字 (Preset):由題目給定,玩家不可更改。
    • 輸入數字 (Input):玩家填入的數字,可變更。
    • 空格 (Empty):尚未填入數字的格子。
  • 初始化一個空盤,並驗證結構能正常運作。

實作過程

Step 1:定義格子狀態

我們使用 enum 來定義三種狀態,讓程式能清楚分辨格子屬性。

// CellType 代表數獨格子的狀態
type CellType int

const (
    Empty CellType = iota // 空格
    Preset                // 題目預設的數字
    Input                 // 玩家輸入的數字
)

Step 2:設計格子結構

一個格子需要存放 數字狀態

// Cell 代表數獨的一個格子
type Cell struct {
    Value int      // 數字,0 表示空格
    Type  CellType // 狀態:Empty、Preset、Input
}

Step 3:設計盤面結構

數獨盤面是 9x9 的二維陣列,用 Board 結構來封裝。

// Board 代表數獨盤面
type Board struct {
    Cells [9][9]Cell
}

Step 4:初始化空盤

我們需要一個函式來產生空盤,所有格子都初始化為 Empty。

// Board - 盤面
type Board struct {
	Cells [9][9]Cell
}

// NewBoard 建立一個空的數獨盤面
func NewBoard() *Board {
	board := &Board{}
	for row := 0; row < 9; row++ {
		for col := 0; col < 9; col++ {
			board.Cells[row][col] = Cell{Value: 0, Type: Empty}
		}
	}
	return board
}

type Game struct {
	board *Board
}

func NewGame() *Game {
	return &Game{
		board: NewBoard(),
	}
}

撰寫測試

func TestNewGame(t *testing.T) {
	tests := []struct {
		name      string
		wantBoard *Board
	}{
		{
			name: "Empty Board",
			wantBoard: &Board{
				Cells: [9][9]Cell{
					{
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
					},
					{
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
					},
					{
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
					},
					{
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
					},
					{
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
					},
					{
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
					},
					{
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
					},
					{
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
					},
					{
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
						{0, Empty}, {0, Empty}, {0, Empty},
					},
				},
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			game := NewGame()
			assert.Equal(t, tt.wantBoard.Cells, game.board.Cells)
		})
	}
}

github action 測試結果

https://github.com/leetcode-golang-classroom/sudoku-game/actions/runs/17499941923

驗收條件

  • ✅ 成功建立盤面資料結構
  • ✅ 所有格子皆初始化為 Empty 狀態
  • ✅ 盤面輸出正確 (9x9 的零矩陣)

今日收穫

  • 學會了如何用 Golang 設計數獨的資料結構。
  • 盤面結構與格子狀態清晰,未來擴充(輸入檢查、題目生成)會更方便。
  • 實際驗證輸出結果,確保結構設計正確。

明日預期

Sudoku 檢查行列與題目生成

  • 基本合法性檢查(數字範圍、位置)
  • 如何透過基本合法性檢查與 Backtrack 演算法生成題目

上一篇
Sudoku 遊戲:數獨遊戲規則與玩法理解
系列文
在 ai 時代 gopher 遊戲開發者的 30 天自我養成23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言